package bancosys.tec.utils.db.converter;

import java.io.File;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author Marcio Ribeiro (mmr)
 * @created Apr 25, 2007
 */
public abstract class DbConverter {
    protected static final Log LOG = LogFactory.getLog(DbConverter.class);

    protected URL inputFile;

    protected File outputFile;

    protected String dbName;

    /**
     * Construtor.
     * 
     * @param inputFile arquivo de entrada.
     * @param outputFile arquivo de saída.
     * @param dbName nome do banco.
     * @throws FileNotFoundException arquivo nao encontrado.
     * @throws MalformedURLException erro no url do arquivo.
     */
    public DbConverter(File inputFile, File outputFile, String dbName) throws FileNotFoundException, MalformedURLException {
        this(inputFile.toURI().toURL(), outputFile, dbName);
    }

    /**
     * Construtor.
     * 
     * @param inputFile arquivo de entrada.
     * @param outputFile arquivo de saida.
     * @param dbName nome do banco.
     */
    public DbConverter(URL inputFile, File outputFile, String dbName) {
        this.inputFile = inputFile;
        this.outputFile = outputFile;
        this.dbName = dbName;
    }

    /**
     * Construtor que não associa o converter a arquivos de entrada e saída. Cria um DB que pode APENAS converter statementes dados por
     * string e devolvê-los da mesma forma.
     */
    public DbConverter() {
        // ok
    }

    /**
     * Converte o arquivo.
     * 
     * @throws CouldNotConvertException erro na conversão do arquivo.
     */
    public void convert() throws CouldNotConvertException {
        File parentDir = this.outputFile.getParentFile();
        if (!parentDir.exists()) {
            parentDir.mkdirs();
        }
        this.doConvert();
    }

    /**
     * Converte o statement passado. É assumido que o statement está 'limpo', sem o caracter de finalização, sem \r... em resumo, pronto
     * para ser convertido sem a ação do StatementSplitter.cleanUpStatement.
     * 
     * @param statement statement limpo
     * @return statement convertido
     */
    public abstract String convertSingleStatement(String statement);

    /**
     * Método template para a conversao do arquivo.
     * 
     * @throws CouldNotConvertException erro na conversão do arquivo.
     */
    protected abstract void doConvert() throws CouldNotConvertException;
}